home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / internet / vbipsmtp / dssock.bas < prev    next >
BASIC Source File  |  1996-03-11  |  13KB  |  475 lines

  1. Attribute VB_Name = "modDSSock"
  2. Option Explicit
  3. '---------------------------------------------------
  4. 'DSSOCK.BAS
  5. 'Copyright 1996 by Carl Franklin
  6. 'Unauthorized reproduction in any medium of this
  7. 'source code is strictly prohibited without written
  8. 'permission from the author and John Wiley & Sons.
  9. '---------------------------------------------------
  10. '-- The Socket array holds information about the socket
  11. '   controls.
  12. Type SockStatusType
  13.     Connected As Integer  '-- Is the socket connected?
  14.     SendReady As Integer  '-- Is the socket ready to send data?
  15. End Type
  16. Global Socket() As SockStatusType
  17.  
  18. '-- gnNumSockets holds the number of loaded socket controls.
  19. Global gnNumSockets As Integer
  20.  
  21. '-- gnConnected is True when the client is connected.
  22. '   Place the line "gnConnected = True" in the client's
  23. '   Connect event.
  24. Global gnConnected As Integer
  25.  
  26. '-- gnSendReady is True when the client is ready to send.
  27. '   Place the line "gnSendReady = True" in the client's
  28. '   SendReady event.
  29. Global gnSendReady As Integer
  30.  
  31. Global Const SOCK_ACTION_CLOSE = 1
  32. Global Const SOCK_ACTION_CONNECT = 2
  33. Global Const SOCK_ACTION_LISTEN = 3
  34. Global Const SOCK_ACTION_UDP_CLIENT = 4
  35. Global Const SOCK_ACTION_UDP_SERVER = 5
  36. Global Const SOCK_ERR_CLOSED = 20000
  37.  
  38. Global Const SOCK_STATE_CLOSED = 1
  39. Global Const SOCK_STATE_CONNECTED = 2
  40. Global Const SOCK_STATE_LISTENING = 3
  41. Global Const SOCK_STATE_CONNECTING = 4
  42. Global Const SOCK_STATE_ERROR = 5
  43. Global Const SOCK_STATE_CLOSING = 6
  44. Global Const SOCK_STATE_UNKNOWN = 7
  45. Global Const SOCK_STATE_BUSY = 8
  46. Global Const SOCK_STATE_UDPACTIVATING = 9
  47. Global Const SOCK_STATE_UDPACTIVE = 10
  48.  
  49. Global Const SOCK_ERR_OPERATIONWOULDBLOCK = 21035
  50.  
  51. Global Const ERR_TIMEOUT_CONNECTING = 2
  52. Global Const ERR_TIMEOUT_DISCONNECTING = 3
  53. Global Const ERR_CONNECT = 4
  54.  
  55. '-- Error log file name. Change if desired
  56. Global Const szLogFileName = "ERRORLOG.TXT"
  57.  
  58. '-- Which debug option is used
  59. Global nDebugMode As Integer
  60.  
  61. Global Const DEBUG_MODE_MINIMAL = 0
  62. Global Const DEBUG_MODE_DESIGNTIME = 1
  63. Global Const DEBUG_MODE_DIALOG = 2
  64. Global Const DEBUG_MODE_WRITELOG = 3
  65.  
  66.  
  67. Function szStripHTML(szString As String) As String
  68. '-- szStripHTML by Carl Franklin
  69. '   This function strips HTML codes from a string
  70. '   and attempts to reformat with CRLFs.
  71.  
  72.  
  73.     Dim szTemp As String
  74.     Dim szResult As String
  75.     Dim nPos As Integer
  76.     Dim nMarker As Integer
  77.     
  78.     '-- Copy the argument into a local
  79.     '   string so the original does not
  80.     '   get whacked.
  81.     szTemp = szString
  82.     
  83.     '-- Remove HTML codes
  84.     Do
  85.         nPos = InStr(szTemp, "<")
  86.         If nPos = False Then
  87.             Exit Do
  88.         Else
  89.             '-- szResult contains the final
  90.             '   product of this routine.
  91.             szResult = szResult & _
  92.                 Left$(szTemp, nPos - 1)
  93.             '-- szTemp is the working string,
  94.             '   which is continuously
  95.             '   shortened as new codes
  96.             '   are found
  97.             szTemp = Mid$(szTemp, nPos + 1)
  98.             nPos = InStr(szTemp, ">")
  99.             If nPos = False Then
  100.                 '-- No complimentary arrow
  101.                 '   was found.
  102.                 Exit Do
  103.             Else
  104.                 '-- What was the code?
  105.                 Select Case szParseString(UCase$(Left$(szTemp, nPos - 1)), " ", 1)
  106.                     Case "P", "/H1", "/H2", "/H3", "/H4", "/H5", "DL"
  107.                         szResult = szResult & vbCrLf & vbCrLf
  108.                     Case "BR"
  109.                         szResult = szResult & vbCrLf
  110.                     Case "HR"
  111.                         szResult = szResult & vbCrLf & String$(50, "-") & vbCrLf
  112.                 End Select
  113.                 
  114.                 
  115.                 '-- Shorten the working
  116.                 '   string
  117.                 szTemp = Mid$(szTemp, _
  118.                     nPos + 1)
  119.             End If
  120.         End If
  121.     Loop
  122.     
  123.     
  124.     '-- Find a marker byte by looking for
  125.     '   a char that does not already exist
  126.     '   in the string.
  127.     For nMarker = 255 To 1 Step -1
  128.         If InStr(szResult, Chr$(nMarker)) = 0 Then
  129.             Exit For
  130.         End If
  131.     Next
  132.     
  133.     '-- Remove carriage returns
  134.     Do
  135.         nPos = InStr(szResult, vbCr)
  136.         If nPos Then
  137.             szResult = Left$(szResult, _
  138.                 nPos - 1) & Mid$(szResult, _
  139.                 nPos + 1)
  140.         Else
  141.             Exit Do
  142.         End If
  143.     Loop
  144.  
  145.     '-- Replace linefeeds with Marker bytes
  146.     Do
  147.         nPos = InStr(szResult, vbLf)
  148.         If nPos Then
  149.             szResult = Left$(szResult, _
  150.                 nPos - 1) & Chr$(nMarker) _
  151.                 & Mid$(szResult, nPos + 1)
  152.         Else
  153.             Exit Do
  154.         End If
  155.     Loop
  156.  
  157.     '-- Replace marker bytes with CR/LF pairs
  158.     Do
  159.         nPos = InStr(szResult, Chr$(nMarker))
  160.         If nPos Then
  161.             szResult = Left$(szResult, _
  162.                 nPos - 1) & vbCrLf _
  163.                 & Trim$(Mid$(szResult, nPos + 1))
  164.         Else
  165.             Exit Do
  166.         End If
  167.     Loop
  168.  
  169.     '-- Thats all for this routine!
  170.     szStripHTML = szResult
  171.  
  172. End Function
  173.  
  174. Function szParseString(szString As String, szDelimiter As String, nSegmentNumber As Integer) As String
  175. '-- Returns a segment of a string given the string,
  176. '   the delimiter, and the segment number
  177.  
  178.     Dim nIndex  As Integer
  179.     Dim szTemp  As String
  180.     Dim nPos    As Integer
  181.  
  182.     '-- Save the string so it does not
  183.     '   get whacked
  184.     szTemp = szString
  185.  
  186.     '-- Strip off the left portion up to the
  187.     '   segment we want
  188.     For nIndex = 1 To nSegmentNumber - 1
  189.         nPos = InStr(szTemp, szDelimiter)
  190.         If nPos Then
  191.             szTemp = Mid$(szTemp, nPos + 1)
  192.         Else
  193.             Exit Function
  194.         End If
  195.     Next
  196.  
  197.     '-- Find the next delimiter
  198.     nPos = InStr(szTemp, szDelimiter)
  199.     '-- Did we find one?
  200.     If nPos Then
  201.         '-- Yep. return everything up to it
  202.         szParseString = Left$(szTemp, nPos - 1)
  203.     Else
  204.         '-- Not found.. return the rest of the
  205.         '   string as is.
  206.         szParseString = szTemp
  207.     End If
  208.  
  209. End Function
  210.  
  211. Sub GetDebugMode()
  212.  
  213.     Dim szCmd As String
  214.     Dim nPos As Integer
  215.  
  216.     szCmd = Trim$(UCase$(Command$))
  217.  
  218.     '-- Are there any command line options?
  219.     If Len(Command) = 0 Then
  220.         '-- No. Exit
  221.         Exit Sub
  222.     Else
  223.         nPos = InStr(Command, "/D")
  224.         If nPos Then
  225.             nDebugMode = Val(Mid$(Command$, nPos + 2, 1))
  226.         End If
  227.     End If
  228.  
  229. End Sub
  230.  
  231. Function szTrimCRLF(szString As String) As String
  232.  
  233.     Dim lStr As Integer
  234.     
  235.     lStr = Len(szString)
  236.     
  237.     If lStr Then
  238.         If Right$(szString, 2) = vbCrLf Then
  239.             szTrimCRLF = Left$(szString, lStr - 2)
  240.         Else
  241.             Select Case Right$(szString, 1)
  242.                 Case vbLf, vbCr
  243.                     szTrimCRLF = Left$(szString, lStr - 1)
  244.                 Case Else
  245.                     szTrimCRLF = szString
  246.             End Select
  247.         End If
  248.     End If
  249.         
  250.  
  251. End Function
  252.  
  253. Sub WriteLogFile(szData As String)
  254.  
  255.     '-- File handle for the log file (if used)
  256.     Static nLogFileNum As Integer
  257.     
  258.     On Error Resume Next
  259.     
  260.     If InStr(UCase$(Command$), "/D") Then
  261.         '-- Is the file not open yet?
  262.         If nLogFileNum = 0 Then
  263.             '-- Open it
  264.             nLogFileNum = FreeFile
  265.             Open App.Path & "\" & szLogFileName For Binary As nLogFileNum
  266.             Seek #nLogFileNum, LOF(nLogFileNum) + 1
  267.         End If
  268.     
  269.         '-- Write the string
  270.         szData = Str$(Now) & Chr$(9) & szData & vbCrLf
  271.         Put #nLogFileNum, , szData
  272.     End If
  273.     
  274. End Sub
  275.  
  276. Sub SendData(DSSock As Control, szData As String)
  277.  
  278.     WriteLogFile "SendData (100): " & Mid$(szData, 1, 100)
  279.  
  280.     gnSendReady = False
  281.     
  282.     On Error Resume Next
  283.     DSSock.Send = szData
  284.     If Err = SOCK_ERR_OPERATIONWOULDBLOCK Then
  285.         Do
  286.             DoEvents
  287.         Loop Until gnSendReady
  288.         DSSock.Send = szData
  289.     ElseIf Err Then
  290.         WriteLogFile "SendData Error: " & Error
  291.     End If
  292.     
  293. End Sub
  294.  
  295.  
  296.  
  297. Function IsDotAddress(szAddress As String) As Integer
  298.  
  299.     '-- This function determines if a string is an IP address like
  300.     '   199.200.199.120 or not
  301.     
  302.     Dim nPos As Integer
  303.     Dim nIndex As Integer
  304.     Dim szSection As String
  305.     Dim szTemp As String
  306.  
  307.     szTemp = szAddress
  308.     szAddress = Trim$(szAddress)
  309.     
  310.     For nIndex = 1 To 3
  311.         nPos = InStr(szAddress, ".")
  312.         If nPos Then
  313.             szSection = Left$(szAddress, nPos - 1)
  314.             If Len(szSection) = 0 Then
  315.                 Exit Function
  316.             ElseIf Trim$(Str$(Val(szSection))) <> szSection Then
  317.                 Exit Function
  318.             ElseIf Val(szSection) > 255 Then
  319.                 Exit Function
  320.             ElseIf Val(szSection) < 0 Then
  321.                 Exit Function
  322.             End If
  323.             szAddress = Mid$(szAddress, nPos + 1)
  324.         Else
  325.             Exit Function
  326.         End If
  327.     Next
  328.  
  329.     If Len(szAddress) = 0 Then
  330.         Exit Function
  331.     ElseIf Trim$(Str$(Val(szAddress))) <> szAddress Then
  332.         Exit Function
  333.     ElseIf Val(szAddress) > 255 Then
  334.         Exit Function
  335.     ElseIf Val(szAddress) < 0 Then
  336.         Exit Function
  337.     End If
  338.  
  339.     szAddress = szTemp
  340.     IsDotAddress = True
  341.  
  342. End Function
  343.  
  344. Function SocketConnect(dsSocket As Control, lPort As Long, szHostAddress As String, nTimeout As Integer) As Integer
  345.  
  346.     Dim EndTime    As Variant
  347.  
  348.     On Error Resume Next
  349.  
  350.     '-- Close the connection
  351.     dsSocket.Action = SOCK_ACTION_CLOSE
  352.     
  353.     '-- Set the specified port
  354.     dsSocket.RemotePort = lPort
  355.     
  356.     '-- Is this a DOT address or a name?
  357.     If IsDotAddress(szHostAddress) Then
  358.         dsSocket.RemoteDotAddr = szHostAddress
  359.     Else
  360.         dsSocket.RemoteHost = szHostAddress
  361.     End If
  362.     
  363.     '-- Reset Err and gnConnected
  364.     Err = 0
  365.     gnConnected = False
  366.     
  367.     '-- Attempt to Connect
  368.     dsSocket.Action = SOCK_ACTION_CONNECT
  369.     If Err Then
  370.         '-- Exit with connect error
  371.         SocketConnect = ERR_CONNECT
  372.         Exit Function
  373.     End If
  374.     
  375.     '-- Wait for the specified period of time
  376.     '   for the connection to be made
  377.     EndTime = DateAdd("s", nTimeout, Now)
  378.     Do
  379.         DoEvents
  380.         If Now >= EndTime Then
  381.             '-- Time's up. Exit with timeout Error
  382.             SocketConnect = ERR_TIMEOUT_CONNECTING
  383.             Exit Function
  384.         End If
  385.     Loop Until gnConnected = True
  386.     
  387.     '-- We've connected!
  388.     SocketConnect = False
  389.  
  390. End Function
  391.  
  392. Sub SocketDisconnect(Ctrl As Control)
  393.  
  394.     WriteLogFile "SocketDisconnect"
  395.     
  396.     On Error Resume Next
  397.     Ctrl.Action = SOCK_ACTION_CLOSE
  398.     gnConnected = False
  399.     
  400. End Sub
  401.  
  402. Function SuperTrim$(szString As String)
  403.  
  404.     Dim nAscFind As Integer
  405.     Dim nAscReplace As Integer
  406.     Dim nMark As Integer
  407.     
  408.     nAscFind = 9
  409.     nAscReplace = 32
  410.     GoSub RemoveAscii
  411.  
  412.     nAscFind = 0
  413.     nAscReplace = 32
  414.     GoSub RemoveAscii
  415.  
  416.     nAscFind = 13
  417.     nAscReplace = 32
  418.     GoSub RemoveAscii
  419.     
  420.     nAscFind = 10
  421.     nAscReplace = 32
  422.     GoSub RemoveAscii
  423.     
  424.     SuperTrim$ = Trim$(szString)
  425.     
  426.     Exit Function
  427.  
  428. RemoveAscii:
  429.  
  430.     Do
  431.         nMark = InStr(szString, Chr$(nAscFind))
  432.         If nMark = 0 Then
  433.             Exit Do
  434.         Else
  435.             If nMark < Len(szString) Then
  436.                 szString = Left$(szString, nMark - 1) & Chr$(nAscReplace) & Mid$(szString, nMark + 1)
  437.             Else
  438.                 szString = Left$(szString, nMark - 1) & Chr$(nAscReplace)
  439.             End If
  440.         End If
  441.     Loop
  442.     Return
  443. End Function
  444.  
  445. Function szLFToCRLF(szData As String) As String
  446.  
  447.     Dim nLen As Integer
  448.     
  449.     nLen = Len(szData)
  450.     
  451.     '-- Make sure the line ends with CRLF and not just LF
  452.     If Right$(szData, 1) = vbLf Then
  453.         If nLen = 1 Then
  454.             If szData = vbLf Then
  455.                 szData = vbCrLf
  456.             End If
  457.         Else
  458.             If Mid$(szData, nLen - 1, 1) <> vbCr Then
  459.                 szData = Left$(szData, nLen - 1) & vbCrLf
  460.             End If
  461.         End If
  462.     Else
  463.         If Right$(szData, 1) = vbCr Then
  464.             szData = szData & vbLf
  465.         Else
  466.             szData = szData & vbCrLf
  467.         End If
  468.     End If
  469.     
  470.     szLFToCRLF = szData
  471.  
  472. End Function
  473.  
  474.  
  475.